package com.gxa.eshps.cores.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Date;
/**
 * @program: IntelliJ IDEA
 * @description:
 * @author: Mr.Wang
 * @create: 2022-07-14 15:35
 **/
public class JwtUtil {
    /**
     * //JWT验证过期时间 EXPIRE_TIME(单位:毫秒) , 指定为30分钟
     * //private static final long EXPIRE_TIME = 30 * 60 * 1000;
     */
    private static final long EXPIRE_TIME = 60 * 1000 * 30;

    /**
     *
     *签发方法,生成Jwt
     */
    public static String sign(String phone) {
        // 设置jwt的过期时间
        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        //普通管理员和超级管理员验证手机号,采用手机号后六位加密生成私钥
        Algorithm algorithm = Algorithm.HMAC256(phone.substring(5));
        //生成jwt: 带有用指定密钥进行加密, 对主体进行加密并设定过去时间
        return JWT.create()
                .withClaim("phone", phone)
                .withExpiresAt(date)
                .sign(algorithm);
    }

    /**
     * 获得token中的信息无需secret解密也可直接获取
     * @return jwt中声明的手机号
     */
    public static String getPhone(String token) {
        // 从token中解密得到jwt中的载荷信息
        // 得到一个可以读取jwt中的信息的调用对象:DecodedJWT
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getClaim("phone").asString();
    }

    /**
     * 校验jwt是否正确
     * @param token 需要校验的jwt字符串
     * @return 返回验证结果
     */
    public static boolean verify(String token, String phone) {
        try {
            //根据密码生成JWT私钥校验器
            // 普通管理员和超级管理员,都采用手机号后六位加密
            Algorithm algorithm = Algorithm.HMAC256(phone.substring(5));
            //校验环节
            // 生成一个校验器
            JWTVerifier verifier = JWT.require(algorithm)
                    .withClaim("phone", phone)
                    .build();
            //效验JWT: 通过异常来确定是否校验成功
            DecodedJWT decodedJwt = verifier.verify(token);
            return true;
        } catch (Exception exception) {
            return false;
        }
    }
}
